package la.foton.atividade.entity;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import org.springframework.security.core.userdetails.UserDetails;


/**
 * The persistent class for the USUARIO database table.
 * 
 */
@Entity
@Table(name="USUARIO")
@NamedQueries({
    @NamedQuery(name="Usuario.findAll",
    		query="SELECT u FROM Usuario u "),
    @NamedQuery(name = "Usuario.findByUsername", 
            query = "SELECT u FROM Usuario u WHERE u.login = :login")
}) 
public class Usuario extends AbstractBean implements UserDetails {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(nullable=false)
	private Integer id;

   @Column(nullable = false, length = 2000000000, unique = true)
	private String login;

	@Column(nullable=false, length=2000000000)
	private String senha;
	
	@ManyToMany	(fetch=FetchType.EAGER)
	@JoinTable(name="PERMISSOES", joinColumns = @JoinColumn(name = "id_usuario"), inverseJoinColumns = @JoinColumn(name = "id_funcionalidade"))
	private List<Funcionalidade> funcionalidades;

	public Usuario() {
	}

   /**
    * Adiciona funcionalidade no array de funcionalidades e ainda verifica se o array não está nulo.
    * 
    * @param funcionalidade
    * @return
    */
   public List<Funcionalidade> addFuncionalidades(Funcionalidade funcionalidade)
   {
      if (getFuncionalidades() == null)
      {
         setFuncionalidades(new ArrayList<Funcionalidade>());
      }
      getFuncionalidades().add(funcionalidade);

      return getFuncionalidades();
   }

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getLogin() {
		return this.login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return this.senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public List<Funcionalidade> getFuncionalidades() {
		return funcionalidades;
	}

	public void setFuncionalidades(List<Funcionalidade> funcionalidades) {
		this.funcionalidades = funcionalidades;
	}

	public Collection<Funcionalidade> getAuthorities() {		
		
		List<Funcionalidade> list = new ArrayList<Funcionalidade>();		
		
		for (Funcionalidade funcionalidade : getFuncionalidades()) {
			funcionalidade.setNome("ROLE_"+funcionalidade.getNome());
			list.add(funcionalidade);			
		}
		
		return list;
	}

	public String getPassword() {		
		return this.senha;
	}

	public String getUsername() {		
		return this.login;
	}

	public boolean isAccountNonExpired() {
		// TODO Auto-generated method stub
		return true;
	}

	public boolean isAccountNonLocked() {
		// TODO Auto-generated method stub
		return true;
	}

	public boolean isCredentialsNonExpired() {
		// TODO Auto-generated method stub
		return true;
	}

	public boolean isEnabled() {
		// TODO Auto-generated method stub
		return true;
	}	

}